﻿#region 基本信息

/*
 * 作者：王玉才 (Wang Yucai)
 * 创建日期：2015-03-05 11:43:00
 * 电子邮件：SourceProStudio@outlook.com 或者 MasterDuner@yeah.net
 * 开发工具：Microsoft VisualStudio 2013 Ultimate Edition
 * 
 * 公共语言运行时(CLR)版本：4.0.30319.18444
 * 适用的.NET Framework SDK版本：4.0及其以上版本
 * 
 * 机器名：GLCHQWYCWINW7
 * 用户名：GUOCOLAND\wangyucai
 */

#endregion


using Spire.Pdf;
using System;
using System.Diagnostics;
using System.IO;
using System.Xml.Xsl;


namespace DeluxeSources.Practices
{
    /// <summary>
    /// <para>
    /// 命名空间：<see cref="DeluxeSources.Practices"/>
    /// </para>
    /// <para>
    /// 类型名称：<see cref="MainForm"/>
    /// </para>
    /// <para>
    /// 此类型(<see cref="MainForm"/>)仅适用于4.0及其以上版本的.NET Framework SDK。
    /// </para>
    /// <para>
    /// © 2015 Wang Yucai.
    /// </para>
    /// </summary>
    partial class MainForm
    {
        #region RegisterControlEventMonitors
        /// <summary>
        /// 注册控件事件的处理方法。
        /// </summary>
        private void RegisterControlEventMonitors()
        {
            this.CtrlButton_Start.Click += MonitorStartButtonClickEvent;
        }
        #endregion

        #region MonitorStartButtonClickEvent
        /// <summary>
        /// 开始按钮单击事件处理方法。
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void MonitorStartButtonClickEvent(object sender, EventArgs e)
        {
            this.SetProgressPictureState();
            this.SetStartButtonEnabledProperty();
            this.TransformDataSource();
        }
        #endregion

        #region SetProgressPictureState
        /// <summary>
        /// 设置进度图片的状态。
        /// </summary>
        /// <param name="visible">是否可见。</param>
        private void SetProgressPictureState(bool visible = true)
        {
            this.CtrlPictureBox_Loading.Visible = visible;
        }
        #endregion

        #region SetStartButtonEnabledProperty
        /// <summary>
        /// 设置启动按钮的Enabled属性。
        /// </summary>
        /// <param name="enabled">是否启用。</param>
        private void SetStartButtonEnabledProperty(bool enabled = false)
        {
            this.CtrlButton_Start.Enabled = enabled;
        }
        #endregion

        #region FindDataSourceFile
        /// <summary>
        /// 检索数据源文件。
        /// </summary>
        /// <returns><see cref="FileInfo"/>对象实例。</returns>
        private FileInfo FindDataSourceFile()
        {
            return new FileInfo(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"App_Data\XDataSource.xml"));
        }
        #endregion

        #region FindTransformFile
        /// <summary>
        /// 搜索数据转换文件(*.xslt)。
        /// </summary>
        /// <returns><see cref="FileInfo"/>对象实例。</returns>
        private FileInfo FindTransformFile()
        {
            return new FileInfo(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"App_Data\XDataSourceTransform.xslt"));
        }
        #endregion

        #region TransformDataSource
        /// <summary>
        /// 转换数据源文件。
        /// </summary>
        private void TransformDataSource()
        {
            FileInfo xDataSource = this.FindDataSourceFile();
            Trace.Write("寻找数据文件" + xDataSource.FullName);
            if (xDataSource.Exists)
            {
                FileInfo xTransformSource = this.FindTransformFile();
                Trace.Write("寻找数据转换文件" + xTransformSource.FullName);
                if (xTransformSource.Exists)
                {
                    Trace.Write("开始转换数据文件！");
                    FileInfo targetFile = this.TransformXData(xDataSource, xTransformSource);
                    Trace.Write(string.Format("数据文件转换完毕！(已生成{0})", targetFile.FullName));
                    this.TransformToPdf(targetFile);
                }
                else
                    Trace.Write(string.Format("数据转换文件{0}未找到！", xTransformSource.FullName));
            }
            else
                Trace.Write(string.Format("数据文件{0}未找到！", xDataSource.FullName));
        }
        #endregion

        #region TransformXData
        /// <summary>
        /// 转换数据文件。
        /// </summary>
        /// <param name="xDataSourceFile"></param>
        /// <param name="xTransformFile"></param>
        /// <returns></returns>
        private FileInfo TransformXData(FileInfo xDataSourceFile, FileInfo xTransformFile)
        {
            DirectoryInfo outputDirectory = new DirectoryInfo(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Output"));
            if (!outputDirectory.Exists) outputDirectory.Create();
            FileInfo outputFile = new FileInfo(Path.Combine(outputDirectory.FullName, DateTime.Now.GetHashCode().ToString("X") + ".html"));
            try
            {
                XslCompiledTransform xTransformCompiled = new XslCompiledTransform(true);
                xTransformCompiled.Load(xTransformFile.FullName);
                xTransformCompiled.Transform(xDataSourceFile.FullName, outputFile.FullName);
            }
            catch
            {
                Trace.Write(string.Format("将数据文件转换为{0}时发生异常！", outputFile.FullName));
            }
            return outputFile;
        }
        #endregion

        #region TransformToPdf
        /// <summary>
        /// 将HTML文件转换成PDF文件。
        /// </summary>
        /// <param name="htmlFile">HTML文件信息。</param>
        private void TransformToPdf(FileInfo htmlFile)
        {
            try
            {
                PdfDocument pdfDocument = new PdfDocument();
                pdfDocument.LoadFromHTML(htmlFile.FullName, false, false, false);
                FileInfo targetPDF = new FileInfo(Path.Combine(htmlFile.Directory.FullName, htmlFile.Name + ".pdf"));
                pdfDocument.SaveToFile(targetPDF.FullName, FileFormat.PDF);
                Trace.Write(string.Format("已经将HTML文件转换为PDF类型的文件：{0}", targetPDF.FullName));
                this.SetStartButtonEnabledProperty(true);
                this.SetProgressPictureState(false);
            }
            catch
            {
                Trace.Write(string.Format("无法转换HTML文件{0}为PDF类型！", htmlFile.FullName));
            }
        }
        #endregion
    }
}

#region 版权声明

/*
 * Copyright © 2015 Wang Yucai. All rights reserved.
 */

#endregion